home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / utility / 329 / xapple.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-18  |  18.4 KB  |  719 lines

  1.  
  2. /***************************************************************************
  3.  
  4.     XAPPLE.C
  5.  
  6.     - Apple ][ service routines
  7.  
  8.     01/26/88 created
  9.     03/03/88 Laser C
  10.  
  11.     07/24/88 21:45
  12.  
  13. ***************************************************************************/
  14.  
  15. #include <stdio.h>
  16. #include <osbind.h>
  17. #include "xglobal.h"
  18. #include "x6502.h"
  19.  
  20. #define GRAPHICS 1
  21. #define TEXT     2
  22. #define FULLGRAF 4
  23. #define SPLITSCR 8
  24. #define PAGE1    16
  25. #define PAGE2    32
  26. #define LORES    64
  27. #define HIRES    128
  28.  
  29. extern
  30.     rsA00(), rsA01(), rsA02(), rsA03(), rsA04(), rsA05(), rsA06(), rsA07(),
  31.     rsA08(), rsA09(), rsA0A(), rsA0B(), rsA0C(), rsA0D(), rsA0E(), rsA0F();
  32.  
  33. extern
  34.     wsA00(), wsA01(), wsA02(), wsA03(), wsA04(), wsA05(), wsA06(), wsA07(),
  35.     wsA08(), wsA09(), wsA0A(), wsA0B(), wsA0C(), wsA0D(), wsA0E(), wsA0F();
  36.  
  37. extern rsAXX(), wsAXX();
  38. extern TextPlotApple();
  39. extern LAmpEaX(), LAmpEaY(), LAfont();
  40. extern Lmp8to16();
  41. extern Apple_Hook();
  42. extern mpSTtoAp();
  43. extern ApOldKey();
  44. extern ApKeyPatch();
  45. extern LAppleVBI();
  46.  
  47. extern int rgwAtColors[16];
  48.  
  49. /* array of pointers to 256 service routines */
  50. void (*Aread_service[17])() =
  51.     {
  52.     rsA00, rsA01, rsA02, rsA03, rsA04, rsA05, rsA06, rsA07,
  53.     rsA08, rsA09, rsA0A, rsA0B, rsA0C, rsA0D, rsA0E, rsA0F, rsAXX
  54.     };
  55.  
  56. void (*Awrite_service[17])() =
  57.     {
  58.     wsA00, wsA01, wsA02, wsA03, wsA04, wsA05, wsA06, wsA07,
  59.     wsA08, wsA09, wsA0A, wsA0B, wsA0C, wsA0D, wsA0E, wsA0F, wsAXX
  60.     };
  61.  
  62. int baddr1[25] =
  63.     {
  64.     0, 1280, 2560, 3840, 5120, 6400, 7680, 8960,
  65.     10240, 11520, 12800, 14080, 15360, 16640, 17920, 19200, 20480,
  66.     21760, 23040, 24320, 25600, 26880, 28160, 29440, 30720
  67.     };
  68.  
  69. int baddr2[25] =
  70.     {
  71.     0, 640, 1280, 1920, 2560, 3200, 3840, 4480, 5120, 5760, 6400, 7040,
  72.     7680, 8320, 8960, 9600, 10240, 10880, 11520, 12160, 12800, 13440, 14080,
  73.     14720, 15360
  74.     };
  75.  
  76. extern char b484Sav;
  77.  
  78. /* This hooks all the interrupt vectors and also does anything that should
  79. ** be done, like clearing console keys, etc.
  80. */
  81.  
  82. Apple_Hook()
  83.     {
  84.  
  85. #ifdef NDEBUG
  86.     printf("Apple_Hook()\n");
  87. #endif
  88.  
  89.     b484Sav = *(char *)0x0484L;
  90.     *(char*)0x0484L &= ~3;      /* disable keyclick */
  91.     
  92.     VBI_on(LAppleVBI);
  93.     ApInstKey();
  94.  
  95.     Setpalette(rgwAtColors);    
  96.     }
  97.     
  98. Apple_Unhook()
  99.     {
  100.     ApRemoveKey();
  101.     VBI_off();
  102.     *(char*)0x0484L = b484Sav;  /* enable keyclick */
  103.  
  104.     Setpalette(rgwPalette);    
  105.  
  106. #ifdef NDEBUG
  107.     printf("Apple_UnHook()\n");
  108. #endif
  109.     }
  110.  
  111. ApInstKey()
  112.     {
  113.     register long *qKbdvBase;
  114.  
  115.     qKbdvBase = (long *) Kbdvbase();
  116.  
  117. asm
  118.     {
  119.     ; turn off mouse     = Bconout(4,$12)
  120.     move.w  #0x12,-(A7)
  121.     move.w  #4,-(A7)
  122.     move.w  #3,-(A7)
  123.     trap    #13
  124.     addq.l  #6,A7
  125.  
  126.     ; get old keyboard vector
  127.     move.l  32(qKbdvBase),ApOldKey
  128.     lea     ApKeyPatch,A1
  129.     move.l  A1,32(qKbdvBase)
  130.  
  131.     ; turn on joysticks = Bconout(4,$14)
  132. ;    move.w  #0x14,-(A7)
  133. ;    move.w  #4,-(A7)
  134. ;    move.w  #3,-(A7)
  135. ;    trap    #13
  136. ;    addq.l  #6,A7
  137.     }
  138.     }
  139.  
  140. ApRemoveKey()
  141.     {
  142.     register long *qKbdvBase;
  143.  
  144.     qKbdvBase = (long *)Kbdvbase();
  145.  
  146. asm {
  147.     ; turn off joysticks = Bconout(4,$1A)
  148. ;    move.w  #0x1a,-(A7)
  149. ;    move.w  #4,-(A7)
  150. ;    move.w  #3,-(A7)
  151. ;    trap    #13
  152. ;    addq.l  #6,A7
  153.     
  154.     move.l  ApOldKey,32(qKbdvBase)     ; recover the old keyboard vector
  155.  
  156.     ; turn on mouse      = Bconout(4,$8)
  157.     move.w  #0x8,-(A7)
  158.     move.w  #4,-(A7)
  159.     move.w  #3,-(A7)
  160.     trap    #13
  161.     addq.l  #6,A7
  162.     }
  163.     }
  164.  
  165. /* initialize the stat arrays and set defaults for power on */
  166. setup_apple()
  167.     {
  168.     register unsigned ea;
  169.     register int x,y;
  170.     register char *qRStat = (char *)lRStat;
  171.     register char *qWStat = (char *)lWStat;
  172.  
  173.     /* clear out stat arrays */
  174.     Blitzl(lRStat - 32768L, 8192);
  175.     Blitzl(lWStat - 32768L, 16384);
  176.  
  177.     /* clear out screen */
  178.     Blitzl(lScr, 10240);
  179.  
  180.     /* clear out RAM */
  181.     Blitc(0xAA, lMemory, 0xC000);
  182.  
  183.     /* write-protect ROM */
  184.     Blitb(lScratch, lMemory + (unsigned)0xD000, 12288);
  185.     Blitc(1+128, &qWStat[0xFFFFC000], 16384);
  186.  
  187.     rgwAtColors[0] = 0;
  188.     rgwAtColors[1] = 0x666;
  189.     rgwAtColors[2] = 0x666;
  190.     rgwAtColors[3] = 0x666;
  191.  
  192.     /* text page 1 */
  193.     for (ea=1024; ea<2048; ea++)
  194.         {
  195.         if ((ea&0x7F) < 120)
  196.              qWStat[ea]=2+128;
  197.         }
  198.  
  199.     qRStat[0xFFFFC000] = 8;     /* keyboard register */
  200.     qRStat[0xFFFFC010] = 9;     /* keyboard strobe */
  201.  
  202.     qWStat[0xFFFFC030] = 10+128;    /* speaker */
  203.  
  204.     {
  205.     int iHeap = 0;
  206.     long lToRS, lToWS;
  207.     long lFromRS, lFromWS, lNextRS, lNextWS;
  208.     int iService = 0;
  209.  
  210.     /* blit the 16 read and 16 write routines */
  211.     do
  212.         {
  213.         lToRS = lEmul + iHeap + (int)iRead;
  214.         lFromRS = (long)Aread_service[iService];
  215.         lNextRS = (long)Aread_service[iService+1];
  216.  
  217.         lToWS = lEmul + iHeap + (int)iWrite;
  218.         lFromWS = (long)Awrite_service[iService];
  219.         lNextWS = (long)Awrite_service[iService+1];
  220.  
  221.         Assert(((int)(lNextRS - lFromRS)) >= 0, "RS blitting negative");
  222.         Assert(((int)(lNextRS - lFromRS)) != 0, "RS blitting 0");
  223.         Assert(((int)(lNextRS - lFromRS)) < 64, "RS blitting >64");
  224.         
  225.         Blitb(lFromRS, lToRS, (int)(lNextRS - lFromRS));
  226.         Blitb(lFromWS, lToWS, (int)(lNextWS - lFromWS));
  227.  
  228.         iHeap += 256;
  229.         iService++;
  230.         } while (iService != 16);
  231.     }
  232.     *(long *)(lEmul + (Jump0)) = (long)TextPlotApple;
  233.  
  234.     /* set initial SP = $FF */
  235.     PutReg('SP',0xFF);
  236.  
  237.     /* to save time when plotting, generate Apple font and x,y info */
  238.  
  239.     qRStat = (char *)LAmpEaX;
  240.     qWStat = (char *)LAmpEaY;
  241.     for (ea=0; ea<1024; ea++)
  242.         {
  243.         qWStat[ea] = (((ea&0x7F)/40)<<3) + (ea>>7); /* screen row */
  244.         qRStat[ea] = (ea&0x7F)%40;                  /* screen column */
  245.         }    
  246.  
  247. /* 0-63 = inverse of 32-96 ??
  248.    64-127 = flashing of same thing
  249.    128-255 = normal
  250. */
  251.  
  252.     qRStat = (char *)lFont8;
  253.     qWStat = (char *)LAfont;
  254.     for (ea=0; ea<256; ea++)
  255.         {
  256.         x = ea & 0x7F;
  257.         if (x<32)
  258.             x += 64;
  259.         else if ((ea >= 96) && (ea < 128))
  260.             x -= 64;
  261.         for (y=0; y<2048; y+= 256)
  262.             {
  263.             *qWStat++ = qRStat[x+y] ^ ((ea & 0x80) ? 0 : ~0);
  264.             }
  265.         }
  266.  
  267.     pHookIn = Apple_Hook;
  268.     pUnHook = Apple_Unhook;
  269.     }
  270.     
  271. /* End of init code */
  272.  
  273.  
  274. TextPlotApple(text,loc)
  275. register int text;
  276. register int loc;
  277.     {
  278.     register int scrx, scry;
  279.     register char *qbFont = (char *)LAfont;
  280.     register char *qbScr = (char *)(lScr+3840L);
  281.     register char *qmp816 = (char *)Lmp8to16;   /* mono only */
  282.  
  283. #ifdef NDEBUG
  284.     printf("ApplePlot(): loc = %d    value = %d\n", loc, text);
  285. #endif
  286.  
  287.     loc &= 1023;
  288.     scrx = *((char *)LAmpEaX + loc);
  289.     scry = *((char *)LAmpEaY + loc);
  290.  
  291.     qbFont += (text << 3);
  292.  
  293.     if (fIsMono)
  294.         goto lPlotAtTextMono;
  295.  
  296. asm
  297.     {
  298.     move.w  scrx,D0               ; do funny bit field gyrations
  299.     andi.w  #~1,D0
  300.     add.w   D0,D0
  301.     add.w   D0,D0
  302.     andi.w  #1,scrx
  303.     or.w    D0,scrx 
  304.     }
  305.  
  306.     qbScr += baddr1[scry] + scrx;
  307.  
  308. asm
  309.     {
  310.     move.b  (qbFont)+,D0
  311.     move.b  D0,(qbScr)
  312.     move.b  D0,2(qbScr)
  313.     sf      4(qbScr)
  314.     sf      6(qbScr)
  315.  
  316.     move.b  (qbFont)+,D0
  317.     move.b  D0,160(qbScr)
  318.     move.b  D0,162(qbScr)
  319.     sf      164(qbScr)
  320.     sf      166(qbScr)
  321.  
  322.     move.b  (qbFont)+,D0
  323.     move.b  D0,320(qbScr)
  324.     move.b  D0,322(qbScr)
  325.     sf      324(qbScr)
  326.     sf      326(qbScr)
  327.  
  328.     move.b  (qbFont)+,D0
  329.     move.b  D0,480(qbScr)
  330.     move.b  D0,482(qbScr)
  331.     sf      484(qbScr)
  332.     sf      486(qbScr)
  333.  
  334.     move.b  (qbFont)+,D0
  335.     move.b  D0,640(qbScr)
  336.     move.b  D0,642(qbScr)
  337.     sf      644(qbScr)
  338.     sf      646(qbScr)
  339.  
  340.     move.b  (qbFont)+,D0
  341.     move.b  D0,800(qbScr)
  342.     move.b  D0,802(qbScr)
  343.     sf      804(qbScr)
  344.     sf      806(qbScr)
  345.  
  346.     move.b  (qbFont)+,D0
  347.     move.b  D0,960(qbScr)
  348.     move.b  D0,962(qbScr)
  349.     sf      964(qbScr)
  350.     sf      966(qbScr)
  351.  
  352.     move.b  (qbFont)+,D0
  353.     move.b  D0,1120(qbScr)
  354.     move.b  D0,1122(qbScr)
  355.     sf      1124(qbScr)
  356.     sf      1126(qbScr)
  357.     }
  358.     return;
  359.  
  360. lPlotAtTextMono:
  361.     qbScr += baddr1[scry] + scrx + scrx;
  362.  
  363. asm
  364.     {
  365.     clr.w   D0
  366.     move.b  (qbFont)+,D0
  367.     add.w   D0,D0
  368.     move.w  0(qmp816,D0),D0
  369.     move.w  D0,(qbScr)
  370.     move.w  D0,80(qbScr)
  371.  
  372.     clr.w   D0
  373.     move.b  (qbFont)+,D0
  374.     add.w   D0,D0
  375.     move.w  0(qmp816,D0),D0
  376.     move.w  D0,160(qbScr)
  377.     move.w  D0,240(qbScr)
  378.  
  379.     clr.w   D0
  380.     move.b  (qbFont)+,D0
  381.     add.w   D0,D0
  382.     move.w  0(qmp816,D0),D0
  383.     move.w  D0,320(qbScr)
  384.     move.w  D0,400(qbScr)
  385.  
  386.     clr.w   D0
  387.     move.b  (qbFont)+,D0
  388.     add.w   D0,D0
  389.     move.w  0(qmp816,D0),D0
  390.     move.w  D0,480(qbScr)
  391.     move.w  D0,560(qbScr)
  392.  
  393.     clr.w   D0
  394.     move.b  (qbFont)+,D0
  395.     add.w   D0,D0
  396.     move.w  0(qmp816,D0),D0
  397.     move.w  D0,640(qbScr)
  398.     move.w  D0,720(qbScr)
  399.  
  400.     clr.w   D0
  401.     move.b  (qbFont)+,D0
  402.     add.w   D0,D0
  403.     move.w  0(qmp816,D0),D0
  404.     move.w  D0,800(qbScr)
  405.     move.w  D0,880(qbScr)
  406.  
  407.     clr.w   D0
  408.     move.b  (qbFont)+,D0
  409.     add.w   D0,D0
  410.     move.w  0(qmp816,D0),D0
  411.     move.w  D0,960(qbScr)
  412.     move.w  D0,1040(qbScr)
  413.  
  414.     clr.w   D0
  415.     move.b  (qbFont)+,D0
  416.     add.w   D0,D0
  417.     move.w  0(qmp816,D0),D0
  418.     move.w  D0,1120(qbScr)
  419.     move.w  D0,1200(qbScr)
  420.     }
  421.     }
  422.  
  423.  
  424. apple()
  425.     {
  426. asm {
  427.  
  428. LAmpEaX:
  429.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  430.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  431.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  432.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  433.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  434.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  435.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  436.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  437.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  438.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  439.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  440.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  441.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  442.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  443.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  444.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  445.  
  446. LAmpEaY:
  447.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  448.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  449.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  450.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  451.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  452.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  453.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  454.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  455.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  456.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  457.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  458.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  459.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  460.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  461.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  462.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  463.  
  464. LAfont:
  465.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  466.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  467.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  468.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  469.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  470.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  471.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  472.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  473.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  474.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  475.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  476.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  477.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  478.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  479.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  480.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  481.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  482.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  483.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  484.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  485.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  486.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  487.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  488.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  489.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  490.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  491.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  492.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  493.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  494.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  495.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  496.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  497.  
  498. wsA00:
  499.     nop     ; this is just a dummy
  500.     DISPATCH
  501.  
  502. ; handler for ROM, do nothing
  503. wsA01:
  504.     addq.l  #2,SP
  505.     DISPATCH
  506.  
  507. ; handler for text page 1
  508. wsA02:
  509.     move.w  (SP)+,drDATA
  510.     move.l  drEA,arEA
  511.     cmp.b   (arEA),drDATA   ; check if byte we're storing is already there
  512.     beq.s   wsA02X           ; if so, no need to plot the character
  513.  
  514.     move.b  drDATA,(arEA)   ; else, store new character and plot it
  515.     SAVEREGS
  516.     move.w  drEA,-(SP)
  517.     move.w  drDATA,-(SP)
  518.     move.l  Jump0(arEMUL),A0
  519.     jsr     (A0)            ; call TextPlotApple(drDATA,drEA)
  520.     addq.l   #4,SP
  521.     LOADREGS
  522. wsA02X:
  523.     DISPATCH
  524.  
  525. wsA03:
  526.     addq.l  #2,SP
  527.     DISPATCH
  528. wsA04:
  529.     addq.l  #2,SP
  530.     DISPATCH
  531. wsA05:
  532.     addq.l  #2,SP
  533.     DISPATCH
  534. wsA06:
  535.     addq.l  #2,SP
  536.     DISPATCH
  537. wsA07:
  538.     addq.l  #2,SP
  539.     DISPATCH
  540. wsA08:
  541.     addq.l  #2,SP
  542.     DISPATCH
  543. wsA09:
  544.     addq.l  #2,SP
  545.     DISPATCH
  546. wsA0A:
  547.     addq.l  #2,SP
  548.     DISPATCH
  549. wsA0B:
  550.     addq.l  #2,SP
  551.     DISPATCH
  552. wsA0C:
  553.     addq.l  #2,SP
  554.     DISPATCH
  555. wsA0D:
  556.     addq.l  #2,SP
  557.     DISPATCH
  558. wsA0E:
  559.     addq.l  #2,SP
  560.     DISPATCH
  561. wsA0F:
  562.     addq.l  #2,SP
  563.     DISPATCH
  564. wsAXX:
  565.     addq.l  #2,SP
  566.     DISPATCH
  567.  
  568. rsA00:
  569.     rts
  570. rsA01:
  571.     rts
  572. rsA02:
  573.     rts
  574. rsA03:
  575.     rts
  576. rsA04:
  577.     rts
  578. rsA05:
  579.     rts
  580. rsA06:
  581.     rts
  582. rsA07:
  583.     rts
  584.  
  585. ; read $C000, the Apple's keyboard register
  586. rsA08:
  587.     movem.l D1-D7/A0-A2,-(SP) ; must save A0, A1, A2 before a TRAP
  588.  
  589.     move.w  #2,-(SP)
  590.     move.w  #1,-(SP)
  591.     trap    #13         ; Bconstat(2)
  592.     addq.l  #4,(SP)+
  593.  
  594.     tst.w   D0          ; is there a key ready?
  595.     bne.s   rsA082       ; yes
  596.     movem.l (SP)+,D1-D7/A0-A2 ; else just exit
  597.     rts
  598.  
  599. rsA082:
  600.     move.w  #2,-(SP)
  601.     move.w  #2,-(SP)
  602.     trap    #13         ; Bconin(2)
  603.     addq.l  #4,(SP)+
  604.  
  605.     andi.w  #0x00FF,drDATA
  606.     beq.s   rsA082_x            ; ignore function and cursor keys
  607.  
  608.     lea     mpSTtoAp,arEA
  609.     move.b  0(arEA,drDATA.w),drDATA
  610.     move.l  drEA,arEA
  611.     move.b  drDATA,(arEA)   ; store character code
  612. rsA082_x:
  613.     movem.l (SP)+,D1-D7/A0-A2
  614.     rts
  615.  
  616. ; Apple's keyboard strobe, clears the high bit of $C000
  617. rsA09:
  618.     move.w  #0xC000,drEA
  619.     move.l  drEA,arEA
  620.     andi.b  #0x7F,(arEA)    ; clear high bit of $C000
  621.     rts
  622.  
  623. rsA0A:
  624.     rts
  625. rsA0B:
  626.     rts
  627. rsA0C:
  628.     rts
  629. rsA0D:
  630.     rts
  631. rsA0E:
  632.     rts
  633. rsA0F:
  634.     rts
  635. rsAXX:
  636.     rts
  637.  
  638. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  639. ; This is the Apple VBI routine
  640. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  641.  
  642. #ifdef DEBUG
  643.     dc.w    'Ap', 'pl', 'eV', 'BI', 0
  644. #endif
  645.  
  646. Lmod:
  647.     dc.w    0
  648.  
  649. LAppleVBI:
  650. ;    move.w  wVBIcount,D0
  651. ;    cmp.w   wVBIrate,D0
  652. ;    bne     LApVBIexit      ; skip wVBIrate VBI's
  653.  
  654. ;    clr.w   wVBIcount
  655.  
  656. LApVBIexit:
  657.     rts
  658.  
  659.  
  660. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  661. ;
  662. ; Keyboard handler to map the ST scan code to an 8 bit internal scan code.
  663. ;
  664. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  665.  
  666. ; some safety room
  667.     dc.w    0
  668.  
  669. #ifdef DEBUG
  670.     dc.w    'Ap', 'Ke', 'yP', 'at', 'ch', 0
  671. #endif
  672.  
  673. ApKeyPatch:
  674.  
  675. ; A1 = lScr, for debugging purposes
  676.     movem.l  A0-A1/D0-D1,-(SP)
  677.  
  678.     move.l  ApOldKey,A0
  679.     jsr     (A0)
  680.  
  681.     clr.w   D0
  682.     move.b  0xFC02,D0
  683.  
  684.     cmpi.b  #0x3F,D0            ; check F5
  685.     bne     Akp2
  686.         
  687.     move.l  lEmul,A0
  688.     move.w  #OP_RTS,(A0)        ; hit F5, so exit
  689.     bra     Akpexit
  690.         
  691. Akp2:
  692.     cmpi.b  #0x44,D0            ; F10 key is SYSTEM RESET (always enabled)
  693.     bra     Akpexit
  694.  
  695.     nop
  696.  
  697. Akpexit:
  698.     movem.l  (SP)+,A0-A1/D0-D1
  699.     rts
  700.  
  701. ApOldKey:
  702.     dc.l    0
  703.  
  704. mpSTtoAp:
  705.     dc.w    0x8081, 0x8283, 0x8485, 0x8687, 0x8889, 0x8A8B, 0x8C8D, 0x8E8F
  706.     dc.w    0x9091, 0x9293, 0x9495, 0x9697, 0x9899, 0x9A9B, 0x9C9D, 0x9E9F
  707.     dc.w    0xA0A1, 0xA2A3, 0xA4A5, 0xA6A7, 0xA8A9, 0xAAAB, 0xACAD, 0xAEAF
  708.     dc.w    0xB0B1, 0xB2B3, 0xB4B5, 0xB6B7, 0xB8B9, 0xBABB, 0xBCBD, 0xBEBF
  709.     dc.w    0xC0C1, 0xC2C3, 0xC4C5, 0xC6C7, 0xC8C9, 0xCACB, 0xCCCD, 0xCECF
  710.     dc.w    0xD0D1, 0xD2D3, 0xD4D5, 0xD6D7, 0xD8D9, 0xDADB, 0xDCDD, 0xDEDF
  711.     dc.w    0xE0E1, 0xE2E3, 0xE4E5, 0xE6E7, 0xE8E9, 0xEAEB, 0xECED, 0xEEEF
  712.     dc.w    0xF0F1, 0xF2F3, 0xF4F5, 0xF6F7, 0xF8F9, 0xFAFB, 0xFCFD, 0xFEFF
  713.  
  714. ; add more assembler code here:
  715.  
  716.     }
  717.     }
  718.  
  719.